// enum (enumeration)

#include <stdio.h>

// enum 枚举类型名字 {名字0, 名字1, ..., 名字n};
// 枚举类型名字通常并不真的使用，要用的是大括号里的名字
// 括号里的名字是常量符号，它们类型是 int ，值则依次从 0 到 n 。
// 声明后，COLOR就是一种新的数据类型
// 在声明的结尾加一个符号，可以记录枚举的数量
enum COLOR {RED, YELLOW, GREEN, NumCOLORS};

// 枚举也可以从任意值开始，不连续也可以
enum TEST {A = 1, B, C = 5};

// 枚举值作为函数参数：
// 类型要写 enum COLOR
void f1(int c);

void f2(enum COLOR c);

int main(int argc, char const *argv[])
{
    int color = -1;
    char* colorName = NULL;

    // COLOR
    // printf("COLOR: %d\n", COLOR);
    printf("RED: %d\n", RED);
    // RED不能作为左值，因为不是变量名
    // RED = RED + 1;

    // enum 的值在计算机内部是以 int 存储的，可以当作 int 参数输入函数
    f1(RED);
    // 对于需要 COLOR 类型参数的函数，编译器好像也不检查输入对不对...
    f2(5);

    // 定义 COLOR 类型的变量
    enum COLOR t = RED;
    // t 可以用 scanf 输入 %d ，也可以以 %d 输出

    printf("Input the number of the color you like: ");
    scanf("%d", &color);
    switch (color)
    {
        case RED:
            colorName = "red";
            break;

        case YELLOW:
            colorName = "yellow";
            break;

        case GREEN:
            colorName = "green";
            break;
    
        default:
            colorName = "unknown";
            break;
    }

    printf("%s\n", colorName);

    printf("\n%d\n", A);
    printf("%d\n", B);
    printf("%d\n", C);
    
    return 0;
}

void f1(int c)
{
    printf("%d\n", c);
}

void f2(enum COLOR c)
{
    printf("%d\n", c);
}